"""
适用装饰器的几种场景：
    无参无返回值
    有参有返回值
    无参有返回值
    有参无返回值
"""
# 需求：定义有参（可变参数）有返回值的原函数：get_sum(), 用于计算两个变量的和
def print_info(fn_name):
    def inner(*args, **kwargs):
        print("【友好提示】正在努力计算中...")
        return fn_name(*args, **kwargs)

    return inner

@print_info
def get_sum(*args, **kwargs):
    # 定义求和变量
    sum = 0
    # 求所有的位置参数的和：*args -> 元祖类型
    for i in args:
        sum += i
    # 求所有的关键字参数的和：**kwargs -> 字典类型
    for i in kwargs.values():
        sum += i

    # 将累加之后的值返回
    return sum

if __name__ == '__main__':
    sum = get_sum(1, 2, 3, a=10, b=20)
    print(sum)
"""
具体执行步骤：
    1:当使用 @print_info 装饰 get_sum 时，相当于执行了：getSum = print_info(get_sum)
    2:此时，print_info(get_sum) 返回的是 inner 函数。所以，getSum 现在实际上是 inner 函数。
    3:当调用 getSum(10, 30) 时，实际上调用的是 inner(10, 30)。
    4:在 inner 函数内部，先打印提示信息，然后调用原始的函数（即之前的 get_sum，被装饰前的函数）并传入参数，得到结果，然后返回。

因此，这个程序的输出应该是：
首先打印： 【友好提示】正在努力计算中...
然后打印：40
"""